package com.ninong.ker.common.annotation.utils;

/**
 * 身份证校验工具类（15位或者18位，最后一位可以为字母）
 * @author cmd
 */
public class IDCardNumberUtil {
    /** 校验结果信息 **/
    public static String exMsg;
    /**
     * 身份证校验方法
     * @author cmd
     * @Date 2020/6/8 15:07
     * @version 1.0
     */
    public static boolean validateIdCardNumber(String number) {
        if (number == null || ValidateConstant.EMPTY.equals(number) || ValidateConstant.NULL.equals(number)) {
            return false;
        }
        // 定义判别用户身份证号的正则表达式（15位或者18位，最后一位可以为字母）
        boolean matches = number.matches(ValidateConstant.EX_ID_NUMBER);
        // 判断第18位校验值
        if (matches) {
        	int num = 18;
            if (number.length() == num) {
                try {
                    char[] charArray = number.toCharArray();
                    // 前十七位加权因子
                    int[] idCardWi = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
                    // 这是除以11后，可能产生的11位余数对应的验证码
                    String[] idCardY = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"};
                    int sum = 0;
                    for (int i = 0; i < idCardWi.length; i++) {
                        int current = Integer.parseInt(String.valueOf(charArray[i]));
                        int count = current * idCardWi[i];
                        sum += count;
                    }
                    char idCardLast = charArray[17];
                    int idCardMod = sum % 11;
                    if (idCardY[idCardMod].toUpperCase()
                            .equals(String.valueOf(idCardLast).toUpperCase())) {
                        return true;
                    } else {
                        exMsg = "身份证最后一位:" + String.valueOf(idCardLast).toUpperCase()
                                + "错误,正确的应该是:" + idCardY[idCardMod].toUpperCase();
                        System.out.println(exMsg);
                        return false;
                    }

                } catch (Exception e) {
                    e.printStackTrace();
                    return false;
                }
            } else {
                return false;
            }
        }
        return matches;
    }
}
